package controller.pub;

import controller.MyCoolServlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import model.User;
import persistence.user.UserDAO;
import persistence.user.UserPersistFactory;

public class CreateUserServlet extends MyCoolServlet {

    @Override
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        UserDAO persistenceManager = UserPersistFactory.getUserDAO(persistenceMechanism);
        User user = generateUserFromRequest(request);
        String errorString = validarCampos(user);
        String password2 = request.getParameter("password2");
        if (errorString.equals("") && !password2.equals(user.getPassword()))
            errorString = "Las dos passwords no son iguales";

        if (errorString.equals("") && user != null && persistenceManager.readUser(user.getUsuario()) == null && persistenceManager.createUser(user)) {
            HttpSession s = request.getSession();
            s.setAttribute("usuario", user);
            request.setAttribute("message", request.getParameter("usuario") + " registrado correctamente.\nAhora descubre nuevas funciones de appBuy.");
            gotoNamedResource(mailServlet, request, response);
        } else {
            if (errorString.equals("")){
                request.setAttribute("message1", "Error al crear el usuario:");
                request.setAttribute("message2", "Es posible que ya exista dicho usuario");
            } else {
                request.setAttribute("message1", "Error al validar");
                request.setAttribute("message2", errorString);
            }
            gotoURL(errorForm, request, response);

        }
    }

    User generateUserFromRequest(HttpServletRequest request) throws NumberFormatException {
        User user = new User();

        String usuario = request.getParameter("usuario");
        String password = request.getParameter("password");
        String correo = request.getParameter("correo");
        String nombre = request.getParameter("nombre");
        String apellido = request.getParameter("apellido");
        String direccion = request.getParameter("direccion");
        String pago = request.getParameter("pago");

        user.setUsuario(usuario);
        user.setPassword(password);
        user.setCorreo(correo);
        user.setNombre(nombre);
        user.setApellido(apellido);
        user.setDireccion(direccion);
        user.setPago(pago);
        return user;
    }

    public String validarCampos(User user){
        String errorString = "";

        if (!validarUsuario(user.getUsuario())){
            errorString += "Usuario ";
        }
        if (!validarPassword(user.getPassword())){
            errorString += "Password ";
        } 
        if (!validarCorreo(user.getCorreo())){
            errorString += "Correo ";
        }
        if (!validarNombre(user.getNombre())){
            errorString += "Nombre ";
        }
        if (!validarApellido(user.getApellido())){
            errorString += "Apellido ";
        }
        if (!validarDireccion(user.getDireccion())){
            errorString += "Direccion ";
        }
        if (errorString.equals("")){
            return errorString;
        } else
            return "Parametros incorrectos: " + errorString;
    }

    private boolean validarNombre(String nombre) {
        boolean isGoodLength = checkLength(nombre, 1, 20);
        return nombre.matches("([a-zA-ZñÑáéíóúÁÉÍÓÚ ])*") && isGoodLength;
    }

    private boolean validarApellido(String apellido) {
        boolean isGoodLength = checkLength(apellido, 1, 40);
        return apellido.matches("([a-zA-ZñÑáéíóúÁÉÍÓÚ ])*") && isGoodLength;
    }

    private boolean validarUsuario(String usuario) {
        boolean isGoodLength = checkLength(usuario, 1, 30);
        return usuario.matches("([a-zA-Z_.0-9])*") && isGoodLength;
    }

    private boolean validarPassword(String password) {
        boolean isGoodLength = checkLength(password, 1, 30);
        return password.matches("([a-zA-Z0-9_-])*") && isGoodLength;
    }

    private boolean validarCorreo(String correo) {
        boolean isGoodLength = checkLength(correo, 1, 50);
        return correo.matches("\\b[A-Z0-9._a-z]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}\\b") && isGoodLength;
    }

    private boolean validarDireccion(String direccion) { //Evitatemos simplemente el XML
        boolean isGoodLength = checkLength(direccion, 1, 140);
        return (!direccion.contains("<") && !direccion.contains(">") )&& isGoodLength;
    }

    private boolean checkLength(String data, int minAceptable, int maxAceptable) {
        int length = data.length();
        boolean isGoodLength = length >= minAceptable && length <= maxAceptable;
        return isGoodLength;
    }
}